/*
 * @LastEditors: 杜康
 * @LastEditTime: 2021-10-09 19:35:32
 */
class List {
    constructor () {
        this.listSize = 0
        this.pos = 0
        this.dataStore = []
    }
    clear () {
        delete this.dataStore
        this.dataStore = []
        this.listSize = this.pos = 0
    }
    // 列表查询元素
    find (elem) {
        for (let i = 0; i < this.dataStore.length; ++i) {
            if (this.dataStore[i] === elem) {
                return i
            }
        }
        return -1
    }
    toString () {
        return this.dataStore // 返回数组的状态
    }
    insert (elem, after) {
        const insertPos = this.find(after)
        if (insertPos > -1) {
            this.dataStore.splice(insertPos + 1, 0, elem)
            ++this.listSize
            return true
        }
        return false
    }
    // 列表添加元素
    append (elem) {
        // this.dataStore[this.listSize] = elem
        // this.listSize += 1
        // 或者写成
        // 当前listSize的值序列的dataStore为append的值，执行完毕以后 listSize += 1
        this.dataStore[this.listSize++] = elem
    }
    remove (elem) {
        let foundAt = this.find(elem)
        if (foundAt > -1) {
            this.dataStore.splice(foundAt, 1)
            --this.listSize
            return true
        }
        return false
    }
    front () {
        this.pos = 0
    }
    end () {
        this.pos = this.listSize - 1
    }
    prev () {
        if (this.pos > 1) {
            --this.pos
        }
    }
    next () {
        if (this.pos < this.listSize) {
            ++this.pos
        }
    }
    length () {
        return this.listSize
    }
    currPos () {
        return this.pos
    }
    moveTo (position) {
        this.pos = position
    }
    getElement () {
        return this.dataStore[this.pos]
    }
    contains (elem) {
        for (let i = 0; i < this.dataStore.length; ++i) {
            if (this.dataStore[i] === elem) {
                return true
            }
        }
        return false
    }
}


// first step
// const names = new List()
// names.append('Cynthia')
// names.append('Raymond')
// names.append('Barbara')
// console.log('🚀 ~ names.toString()', names.toString())
// names.remove('Raymond')
// console.log('🚀 ~ names.toString()', names.toString())

// second step
// const names = new List()
// names.append('Clayton')
// names.append('Raymond')
// names.append('Cynthia')
// names.append('Jennifer')
// names.append('Bryan')
// names.append('Danny')
// names.front()
// console.log('🚀 ~ names.getElement()', names.getElement())
// names.next()
// console.log('🚀 ~ names.getElement()', names.getElement())
// names.next()
// names.next()
// names.prev()
// console.log('🚀 ~ names.getElement()', names.getElement())

/**
 *  迭代器的特点
 *  1、迭代器访问数据列表元素时不关心底层的数据存储结构
 *  2、当列表添加一个元素的时候，索引的值就不对了，此时只用更新列表，而不用更新迭代器
 *  3、可以用不同类型的数据存储方式实现clist类，迭代器为访问列表里的元素提供一种统一的方式
 */

// example
const names = new List()
names.append('Clayton')
names.append('Raymond')
names.append('Cynthia')
names.append('Jennifer')
names.append('Bryan')
names.append('Danny')
// 正迭代器
for (names.front(); names.currPos() < names.length(); names.next()) {
    console.log('🚀 ~ names.getElement()', names.getElement())
}
// 逆迭代器
for (names.end(); names.currPos() >= 0; names.prev()) {
    console.log('🚀 ~ names.getElement()', names.getElement())
}